package com.wande.dataplatform.filecollection.common.utils;

import cn.hutool.crypto.digest.DigestUtil;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 文件MD5工具类
 *
 * @author wande
 */
public class FileMd5Utils {

    /**
     * 计算文件MD5值
     *
     * @param file 文件
     * @return MD5值
     */
    public static String calculateMd5(File file) throws IOException {
        try (FileInputStream fis = new FileInputStream(file)) {
            return DigestUtil.md5Hex(fis);
        }
    }

    /**
     * 计算输入流MD5值
     *
     * @param inputStream 输入流
     * @return MD5值
     */
    public static String calculateMd5(InputStream inputStream) {
        return DigestUtil.md5Hex(inputStream);
    }

    /**
     * 验证文件MD5值
     *
     * @param file        文件
     * @param expectedMd5 期望的MD5值
     * @return true-匹配，false-不匹配
     */
    public static boolean verifyMd5(File file, String expectedMd5) throws IOException {
        String actualMd5 = calculateMd5(file);
        return actualMd5.equalsIgnoreCase(expectedMd5);
    }

    /**
     * 验证输入流MD5值
     *
     * @param inputStream 输入流
     * @param expectedMd5 期望的MD5值
     * @return true-匹配，false-不匹配
     */
    public static boolean verifyMd5(InputStream inputStream, String expectedMd5) {
        String actualMd5 = calculateMd5(inputStream);
        return actualMd5.equalsIgnoreCase(expectedMd5);
    }
}
